
/**
 * 
 */
package ar.com.greensoft.neosystem.model.internacion;

import java.util.Date;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.NotEmpty;

import ar.com.greensoft.neosystem.model.BaseEntity;
import ar.com.greensoft.neosystem.model.PersonaFisica;
import ar.com.greensoft.neosystem.model.references.EstadoInternacion;
import ar.com.greensoft.neosystem.model.references.Sexo;

/**
 * 
 * @author Jorge E. Villaverde
 * @since 23/11/2012
 * @version 1.0.0
 */
@Entity
@Table(name="internacion")
@Inheritance(strategy=InheritanceType.JOINED)
@NamedQueries({
	@NamedQuery(name=Internacion.FIND_ALL_QUERY_NAME, query="SELECT p FROM Internacion p ORDER BY p.fechaAlta"),
	@NamedQuery(name=Internacion.COUNT_QUERY_NAME,    query="SELECT COUNT(p) FROM Internacion p")
})
public class Internacion extends BaseEntity {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 5175830844545013552L;
	
	// Constants ----------------------------------------------------------------------------------
	
	public static final String FIND_ALL_QUERY_NAME = "Internacion.findAll";
	public static final String COUNT_QUERY_NAME = "Internacion.count";

	// Properties ---------------------------------------------------------------------------------
	
	/**
	 * Fecha de alta de la internación
	 */
	@Temporal(TemporalType.TIMESTAMP)
	@NotNull
    @Column(name = "fecha")
	private Date fecha;

	/**
	 * Fecha de alta de la internación
	 */
	@Temporal(TemporalType.TIMESTAMP)
    @Column(name = "fecha_alta")
	private Date fechaAlta;
		
	/**
	 * Fecha de alta de la derivacion
	 */
	@Temporal(TemporalType.TIMESTAMP)
    @Column(name = "fechaDerivacion")
	private Date fechaDerivacion;
	
	/**
	 * Fecha de alta de deceso
	 */
	@Temporal(TemporalType.TIMESTAMP)
    @Column(name = "fecha_deceso")
	private Date fechaDeceso;
	
	/* ------------------ Datos del internado ------------------------------*/
	/**
	 * Person's First Name
	 */
	@NotNull
	@Size(min=1, max=50)
	private String primerNombre;

	/**
	 * Person's Middle Name
	 */
	@Size(max=50)
	private String segundoNombre;
	
	/**
	 * Person's Last Name
	 */
	@NotNull
	@Size(min=1, max=50)
	private String apellido1;

	/**
	 * Person's second last name
	 */
	@Size(max=50)
	private String apellido2;

	/**
	 * Date of Birth (DoB) of the person.
	 */
	@Temporal(TemporalType.TIMESTAMP)
    @Column(name = "fecha_nacimiento")
	private Date fechaNacimiento;
		
	@NotNull
	@Enumerated(EnumType.STRING)
	private Sexo sexo;
	
	/**
	 * Datos de la Madre del Internado
	 */
	@NotNull
	@ManyToOne(fetch=FetchType.LAZY, cascade=CascadeType.ALL)
	@JoinColumn(name="id_madre")
	private PersonaFisica madre;
	
	/**
	 * Motivo de la Internación
	 */
	@NotEmpty
	@Size(min=2, max=500)
	@Column(name = "motivo_internacion")
	private String motivoInternacion;
	
	@Enumerated(EnumType.STRING)
	@NotNull
	@Column(name = "estado")
	private EstadoInternacion estado;
	
	@Size(max=500)
	@Column(name = "motivo")
	private String motivo;

	// Actions ------------------------------------------------------------------------------------
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = super.hashCode();
		result = prime * result
				+ ((fechaAlta == null) ? 0 : fechaAlta.hashCode());
		result = prime * result
				+ ((fechaNacimiento == null) ? 0 : fechaNacimiento.hashCode());
		result = prime * result + ((madre == null) ? 0 : madre.hashCode());
		return result;
	}

	// Getters/setters ----------------------------------------------------------------------------
	
	public Date getFechaAlta() {
		return fechaAlta;
	}

	public void setFechaAlta(Date fechaAlta) {
		this.fechaAlta = fechaAlta;
	}

	public Date getFechaNacimiento() {
		return fechaNacimiento;
	}

	public void setFechaNacimiento(Date fechaNacimiento) {
		this.fechaNacimiento = fechaNacimiento;
	}

	public PersonaFisica getMadre() {
		return madre;
	}

	public void setMadre(PersonaFisica madre) {
		this.madre = madre;
	}
	
	public String getMotivoInternacion() {
		return motivoInternacion;
	}

	public void setMotivoInternacion(String motivoInternacion) {
		this.motivoInternacion = motivoInternacion;
	}

	public Date getFecha() {
		return fecha;
	}

	public void setFecha(Date fecha) {
		this.fecha = fecha;
	}

	public Date getFechaDerivacion() {
		return fechaDerivacion;
	}

	public void setFechaDerivacion(Date fechaDerivacion) {
		this.fechaDerivacion = fechaDerivacion;
	}

	public Date getFechaDeceso() {
		return fechaDeceso;
	}

	public void setFechaDeceso(Date fechaDeceso) {
		this.fechaDeceso = fechaDeceso;
	}

	public EstadoInternacion getEstado() {
		return estado;
	}

	public void setEstado(EstadoInternacion estado) {
		this.estado = estado;
	}

	public String getMotivo() {
		return motivo;
	}

	public void setMotivo(String motivo) {
		this.motivo = motivo;
	}

	public String getPrimerNombre() {
		return primerNombre;
	}

	public void setPrimerNombre(String primerNombre) {
		this.primerNombre = primerNombre;
	}

	public String getSegundoNombre() {
		return segundoNombre;
	}

	public void setSegundoNombre(String segundoNombre) {
		this.segundoNombre = segundoNombre;
	}

	public String getApellido1() {
		return apellido1;
	}

	public void setApellido1(String apellido1) {
		this.apellido1 = apellido1;
	}

	public String getApellido2() {
		return apellido2;
	}

	public void setApellido2(String apellido2) {
		this.apellido2 = apellido2;
	}

	public Sexo getSexo() {
		return sexo;
	}

	public void setSexo(Sexo sexo) {
		this.sexo = sexo;
	}
}
